#include "usart.h"

#include <QDebug>

extern "C"
{
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
}


Rfid::Rfid()
{

}

void Rfid::run()
{
   int fd;

   std::string path = "/dev/ttySAC" + std::to_string(serial);
   printf("run: %s\n", path.c_str());
   int data = 1;
   while(1)
   {
       if(cmd!=0)
       {
           fd = open(path.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
           if (fd < 0)
           {
               fprintf(stderr, "Open Gec210_ttySAC3 fail!\n");
               return;
           }
           /*初始化串口*/
           init_tty(fd);
           timeout.tv_sec = 1;
           timeout.tv_usec = 0;

           if ( PiccRequest(fd) )
           {
               //printf("The request failed!\n");
               //emit send_id(0);
           }
           close(fd);
       }

       msleep(10);

#if 0
       if(data == 2)
       {
           data = 1;
       }
       else
       {
           data = 2;
       }
       cmd = data;
       msleep(3000);
#endif
   }
}

/* 设置窗口参数:9600速率 */
void Rfid::init_tty(int fd)
{
    //声明设置串口的结构体
    struct termios termios_new;
    //先清空该结构体
    bzero( &termios_new, sizeof(termios_new));
    //	cfmakeraw()设置终端属性，就是设置termios结构中的各个参数。
    cfmakeraw(&termios_new);
    //设置波特率
    //termios_new.c_cflag=(B9600);
    cfsetispeed(&termios_new, B115200);
    cfsetospeed(&termios_new, B115200);
    //CLOCAL和CREAD分别用于本地连接和接受使能，因此，首先要通过位掩码的方式激活这两个选项。
    termios_new.c_cflag |= CLOCAL | CREAD;
    //通过掩码设置数据位为8位
    termios_new.c_cflag &= ~CSIZE;
    termios_new.c_cflag |= CS8;
    //设置无奇偶校验
    termios_new.c_cflag &= ~PARENB;
    //一位停止位
    termios_new.c_cflag &= ~CSTOPB;
    tcflush(fd,TCIFLUSH);
    // 可设置接收字符和等待时间，无特殊要求可以将其设置为0
    termios_new.c_cc[VTIME] = 10;
    termios_new.c_cc[VMIN] = 1;
    // 用于清空输入/输出缓冲区
    tcflush (fd, TCIFLUSH);
    //完成配置后，可以使用以下函数激活串口设置
    if(tcsetattr(fd,TCSANOW,&termios_new) )
        printf("Setting the serial1 failed!\n");

}

void Rfid::sendData(int data)
{
    cmd = data;
}

/*计算校验和*/
unsigned char Rfid::CalBCC(unsigned char *buf, int n)
{
    int i;
    unsigned char bcc=0;
    for(i = 0; i < n; i++)
    {
        bcc ^= *(buf+i);
    }
    return (~bcc);
}

int Rfid::PiccRequest(int fd)
{
    unsigned char WBuf[128], RBuf[128];
    int  ret=0, i;
    fd_set rdfd;
qDebug() << "send: " << cmd;
    memset(WBuf, 0, 128);
    memset(RBuf,0,128);
    WBuf[0] = cmd;	//帧长= 7 Byte
cmd = 0;
    FD_ZERO(&rdfd);
    FD_SET(fd,&rdfd);

    write(fd, WBuf, 1);
    ret = select(fd + 1,&rdfd, NULL,NULL,&timeout);
    switch(ret)
    {
        case -1:
            perror("select error\n");
            break;
        case  0:
            printf("Request timed out.\n");
            break;
        default:
            ret = read(fd, RBuf, 3);
            if (ret < 0)
            {
                printf("ret = %d, %m\n", ret, errno);
                break;
            }
            printf("read = %s\n", (char *)RBuf);
            break;
    }
    return -1;
}


int Rfid::PiccAnticoll(int fd)
{
}
